package com.iwhalecloud.bss.kite.cucc.service.attr.linkhandler;

import java.util.List;
import java.util.Optional;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.iwhalecloud.bss.kite.common.constant.KeyConsts;
import com.iwhalecloud.bss.kite.common.util.KiteBeanUtils;
import com.iwhalecloud.bss.kite.common.util.KiteObjectUtils;
import com.iwhalecloud.bss.kite.common.util.KiteStringUtils;
import com.iwhalecloud.bss.kite.cucc.service.attr.handler.ApnTypeAttrHandler;
import com.iwhalecloud.bss.kite.dataservice.cache.AttrValueCache;
import com.iwhalecloud.bss.kite.dataservice.entity.AttrValue;
import com.iwhalecloud.bss.kite.listener.handler.attr.annotation.AttrHandler;
import com.iwhalecloud.bss.kite.listener.handler.attr.impl.AbstractAttrLinkageHandler;
import com.iwhalecloud.bss.kite.manager.api.IQuerySceneInstService;
import com.iwhalecloud.bss.kite.manager.enums.InstType;
import com.iwhalecloud.bss.kite.manager.inst.KiteAttr;
import com.iwhalecloud.bss.kite.manager.inst.KiteAttrValue;
import com.iwhalecloud.bss.kite.manager.inst.KiteInst;
import com.iwhalecloud.bss.kite.manager.inst.KiteProdInstFunc;
import com.iwhalecloud.bss.kite.service.attr.AttrData;
import com.iwhalecloud.bss.kite.service.scene.attr.OperateInstAttrService;

/**
 * APN类型联动设值
 * Created by  huanghaosheng on 2020/11/25 14:53
 */
@Service
@AttrHandler(ApnTypeAttrHandler.class)
public class ApnTypeAttrLinkHandler extends AbstractAttrLinkageHandler<AttrData> {

    @Autowired
    OperateInstAttrService operateInstAttrService;

    @Autowired
    private IQuerySceneInstService querySceneInstService;

    private static final String APNHLWVALUE = "100003262";

    private static final String APNVPDNVALUE = "100006957";

    private static final String APNMECVALUE = "100007260";

    @Override
    public void handle(KiteAttr attr, KiteInst inst, AttrData data) {
        // 解决连接类型为5G时,展示速率不同
        if (!KiteObjectUtils.isEmpty(attr)) {
            KiteProdInstFunc funcInst = (KiteProdInstFunc) inst;
            String prodInstId = funcInst.getAccProdInstId();
            KiteInst kiteInst = querySceneInstService
                .getKiteInst(inst.getOwnerCustId(), InstType.PROD_INST, prodInstId);
            if (!KiteObjectUtils.isEmpty(kiteInst)) {
                // 连接类型为5G时
                Optional.ofNullable(kiteInst.getAttr("200003674")).ifPresent(connectionAttr -> {
                    if (KiteStringUtils.equals("1_0000102", connectionAttr.getValue())) {
                        // 读取新的速率下拉框值
                        List<AttrValue> attrValueList = AttrValueCache.get("20201205012");
                        List<KiteAttrValue> kiteAttrValueList = KiteBeanUtils
                            .copyPropsForList(attrValueList, KiteAttrValue.class);
                        // 重新给"速率"赋值
                        Optional.ofNullable(inst.getAttr("200004004")).ifPresent(funcAttr -> {
                            funcAttr.setAttrValues(kiteAttrValueList);
                            funcAttr.setDefaultValue("100007044");
                            funcAttr.setValue("100007044");
                            operateInstAttrService
                                .setAttrValue(inst, "200004004", "100007044", data.getSceneInstId(), null);
                        });
                    }
                });
            }
        }
    }

    @Override
    public void handleStyle(KiteAttr attr, KiteInst inst, AttrData data) {
        //互联网或MEC
        if (!KiteObjectUtils.isEmpty(attr) && (KiteStringUtils.isEqual(attr.getValue(), APNHLWVALUE) || KiteStringUtils
            .isEqual(attr.getValue(), APNMECVALUE))) {
            if (KiteStringUtils.isEqual(attr.getValue(), APNHLWVALUE)) {
                Optional.ofNullable(inst.getAttr("200004009"))
                    .ifPresent(kiteAttr -> kiteAttr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_E));
                Optional.ofNullable(inst.getAttr("200004009"))
                    .ifPresent(kiteAttr -> kiteAttr.setIsNull(KeyConsts.IFTRUE_T));
                /*Optional.ofNullable(inst.getAttr("200004014"))
                    .ifPresent(kiteAttr -> kiteAttr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_E));
                Optional.ofNullable(inst.getAttr("200004014"))
                    .ifPresent(kiteAttr -> kiteAttr.setIsNull(KeyConsts.IFTRUE_T));*/
                // 定制类NB的APN不要展示以下属性
                if (!KiteStringUtils.isEqual(inst.getSpecId(), "30000015012")) {
                    // IP地址
                    Optional.ofNullable(inst.getAttr("200001489"))
                        .ifPresent(kiteAttr -> kiteAttr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_D));
                    // URL
                    Optional.ofNullable(inst.getAttr("200004002"))
                        .ifPresent(kiteAttr -> kiteAttr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_D));
                    // 使用PCRF
                    Optional.ofNullable(inst.getAttr("200004005"))
                        .ifPresent(kiteAttr -> kiteAttr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_D));
                    Optional.ofNullable(inst.getAttr("200004005"))
                        .ifPresent(kiteAttr -> kiteAttr.setIsNull(KeyConsts.IFTRUE_F));
                }

            }
            else {
                Optional.ofNullable(inst.getAttr("200004009"))
                    .ifPresent(kiteAttr -> kiteAttr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_D));
                Optional.ofNullable(inst.getAttr("200004009"))
                    .ifPresent(kiteAttr -> kiteAttr.setIsNull(KeyConsts.IFTRUE_F));
                /*Optional.ofNullable(inst.getAttr("200004014"))
                    .ifPresent(kiteAttr -> kiteAttr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_D));
                Optional.ofNullable(inst.getAttr("200004014"))
                    .ifPresent(kiteAttr -> kiteAttr.setIsNull(KeyConsts.IFTRUE_F));*/
                if (!KiteStringUtils.isEqual(inst.getSpecId(), "30000015012")) {
                    Optional.ofNullable(inst.getAttr("200001489"))
                        .ifPresent(kiteAttr -> kiteAttr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_E));
                    Optional.ofNullable(inst.getAttr("200004002"))
                        .ifPresent(kiteAttr -> kiteAttr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_E));
                    Optional.ofNullable(inst.getAttr("200004005"))
                        .ifPresent(kiteAttr -> kiteAttr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_E));
                    Optional.ofNullable(inst.getAttr("200004005"))
                        .ifPresent(kiteAttr -> kiteAttr.setIsNull(KeyConsts.IFTRUE_T));
                }

            }

            Optional.ofNullable(inst.getAttr("200004006"))
                .ifPresent(kiteAttr -> kiteAttr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_E));
            Optional.ofNullable(inst.getAttr("200004006"))
                .ifPresent(kiteAttr -> kiteAttr.setIsNull(KeyConsts.IFTRUE_T));
            Optional.ofNullable(inst.getAttr("200004007"))
                .ifPresent(kiteAttr -> kiteAttr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_E));
            Optional.ofNullable(inst.getAttr("200004007"))
                .ifPresent(kiteAttr -> kiteAttr.setIsNull(KeyConsts.IFTRUE_T));
            Optional.ofNullable(inst.getAttr("200004008"))
                .ifPresent(kiteAttr -> kiteAttr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_E));
            Optional.ofNullable(inst.getAttr("200004008"))
                .ifPresent(kiteAttr -> kiteAttr.setIsNull(KeyConsts.IFTRUE_T));

            Optional.ofNullable(inst.getAttr("200004013"))
                .ifPresent(kiteAttr -> kiteAttr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_E));
            Optional.ofNullable(inst.getAttr("200004013"))
                .ifPresent(kiteAttr -> kiteAttr.setIsNull(KeyConsts.IFTRUE_T));
            Optional.ofNullable(inst.getAttr("200003870"))
                .ifPresent(kiteAttr -> kiteAttr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_E));
            Optional.ofNullable(inst.getAttr("200003870"))
                .ifPresent(kiteAttr -> kiteAttr.setIsNull(KeyConsts.IFTRUE_T));
            Optional.ofNullable(inst.getAttr("200004017"))
                .ifPresent(kiteAttr -> kiteAttr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_E));
            Optional.ofNullable(inst.getAttr("200004017"))
                .ifPresent(kiteAttr -> kiteAttr.setIsNull(KeyConsts.IFTRUE_T));
            Optional.ofNullable(inst.getAttr("200001808"))
                .ifPresent(kiteAttr -> kiteAttr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_E));
            Optional.ofNullable(inst.getAttr("200001808"))
                .ifPresent(kiteAttr -> kiteAttr.setIsNull(KeyConsts.IFTRUE_T));
            Optional.ofNullable(inst.getAttr("200004242"))
                .ifPresent(kiteAttr -> kiteAttr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_E));
            Optional.ofNullable(inst.getAttr("200004242"))
                .ifPresent(kiteAttr -> kiteAttr.setIsNull(KeyConsts.IFTRUE_T));
            Optional.ofNullable(inst.getAttr("200004015"))
                .ifPresent(kiteAttr -> kiteAttr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_E));
            Optional.ofNullable(inst.getAttr("200004015"))
                .ifPresent(kiteAttr -> kiteAttr.setIsNull(KeyConsts.IFTRUE_T));
            Optional.ofNullable(inst.getAttr("200004016"))
                .ifPresent(kiteAttr -> kiteAttr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_E));
            Optional.ofNullable(inst.getAttr("200004016"))
                .ifPresent(kiteAttr -> kiteAttr.setIsNull(KeyConsts.IFTRUE_T));
            Optional.ofNullable(inst.getAttr("200004009")).ifPresent(kiteAttr -> {
                if (KiteStringUtils.isEqual(KeyConsts.PROD_ATTR_SHOW_TYPE_E, kiteAttr.getShowType())) {
                    Optional.ofNullable(inst.getAttr("200004010")).ifPresent(funcAttr -> {
                        funcAttr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_E);
                        funcAttr.setIsNull(KeyConsts.IFTRUE_T);
                    });
                    Optional.ofNullable(inst.getAttr("200004011")).ifPresent(funcAttr -> {
                        funcAttr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_E);
                        funcAttr.setIsNull(KeyConsts.IFTRUE_T);
                    });
                    Optional.ofNullable(inst.getAttr("200004012")).ifPresent(funcAttr -> {
                        funcAttr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_E);
                        funcAttr.setIsNull(KeyConsts.IFTRUE_T);
                    });
                }
            });
        }
        //VPDN
        if (!KiteObjectUtils.isEmpty(attr) && KiteStringUtils.isEqual(attr.getValue(), APNVPDNVALUE)) {
            Optional.ofNullable(inst.getAttr("200001489"))
                .ifPresent(kiteAttr -> kiteAttr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_E));
            Optional.ofNullable(inst.getAttr("200001489"))
                .ifPresent(kiteAttr -> kiteAttr.setIsNull(KeyConsts.IFTRUE_T));
            Optional.ofNullable(inst.getAttr("200004002"))
                .ifPresent(kiteAttr -> kiteAttr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_E));
            Optional.ofNullable(inst.getAttr("200004002"))
                .ifPresent(kiteAttr -> kiteAttr.setIsNull(KeyConsts.IFTRUE_T));
            Optional.ofNullable(inst.getAttr("200004005"))
                .ifPresent(kiteAttr -> kiteAttr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_E));
            Optional.ofNullable(inst.getAttr("200004005"))
                .ifPresent(kiteAttr -> kiteAttr.setIsNull(KeyConsts.IFTRUE_T));
            Optional.ofNullable(inst.getAttr("200004015"))
                .ifPresent(kiteAttr -> kiteAttr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_E));
            Optional.ofNullable(inst.getAttr("200004015"))
                .ifPresent(kiteAttr -> kiteAttr.setIsNull(KeyConsts.IFTRUE_T));
            Optional.ofNullable(inst.getAttr("200004016"))
                .ifPresent(kiteAttr -> kiteAttr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_E));
            Optional.ofNullable(inst.getAttr("200004016"))
                .ifPresent(kiteAttr -> kiteAttr.setIsNull(KeyConsts.IFTRUE_T));

            Optional.ofNullable(inst.getAttr("200004009")).ifPresent(kiteAttr -> {
                if (KiteStringUtils.isEqual("1_0000107", kiteAttr.getValue()) && !KiteStringUtils
                    .isEqual(KeyConsts.PROD_ATTR_SHOW_TYPE_E, kiteAttr.getShowType())) {
                    Optional.ofNullable(inst.getAttr("200004010")).ifPresent(funcAttr -> {
                        funcAttr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_D);
                        funcAttr.setIsNull(KeyConsts.IFTRUE_F);
                    });
                }
            });

            Optional.ofNullable(inst.getAttr("200004006")).ifPresent(kiteAttr -> {
                if (KiteStringUtils.isEqual("1_0000107", kiteAttr.getValue())) {
                    Optional.ofNullable(inst.getAttr("200004008")).ifPresent(funcAttr -> {
                        funcAttr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_E);
                        funcAttr.setIsNull(KeyConsts.IFTRUE_T);
                    });
                }
            });

            // 客户公网IP
            Optional.ofNullable(inst.getAttr("200004007")).ifPresent(kiteAttr -> {
                    KiteAttr speedAttr = inst.getAttr("200004001"); //细分业务类型
                    // APN类型选择VPDN 细分业务类型选择互联网GRE或互联网L2TP 时，客户公网IP必填
                    if (KiteStringUtils.equalsAny(speedAttr.getValue(), "100006960", "100006961")) {
                        kiteAttr.setIsNull(KeyConsts.IFTRUE_F);
                    } else {
                        kiteAttr.setIsNull(KeyConsts.IFTRUE_T);
                    }
                }
            );
            // VLAN号
            Optional.ofNullable(inst.getAttr("200004242")).ifPresent(kiteAttr -> {
                    KiteAttr speedAttr = inst.getAttr("200004001"); //细分业务类型
                    // APN类型选择VPDN 细分业务类型选择专线GRE或专线L2TP 时，VLAN号选填
                    if (KiteStringUtils.equalsAny(speedAttr.getValue(), "100006962", "100006963")) {
                        kiteAttr.setIsNull(KeyConsts.IFTRUE_T);
                    } else {
                        kiteAttr.setIsNull(KeyConsts.IFTRUE_F);
                    }
                }
            );
        }
        //互联网
        if (!KiteObjectUtils.isEmpty(attr) && KiteStringUtils.isEqual(attr.getValue(), APNHLWVALUE)) {
            //是否固定ip不可编辑
            Optional.ofNullable(inst.getAttr("200004084"))
                .ifPresent(kiteAttr -> kiteAttr.setIsEdit(KeyConsts.IFTRUE_F));
        }
    }
}
